package monitormercado.negocio.analise.estrategia;

import java.util.Date;
import java.util.List;

import monitormercado.framework.Analise;
import monitormercado.framework.Conclusao;
import monitormercado.framework.Estrategia;
import monitormercado.framework.Sinal;
import monitormercado.negocio.Tick.ControladorTick;
import monitormercado.negocio.Tick.Tick;
import monitormercado.negocio.analise.estrategia.simulacao.ResultadoCombinadoSimulacao;
import monitormercado.negocio.analise.estrategia.simulacao.ResultadoFinalSimulacaoAcao;
import monitormercado.negocio.analise.estrategia.simulacao.ResultadoParcialSimulacao;
import monitormercado.negocio.analise.estrategia.simulacao.Simulador;
import monitormercado.negocio.analise.indicador.padraocandle.PadraoCandle;
import monitormercado.persistencia.FachadaBD;
import monitormercado.util.Configuracao;
import monitormercado.util.Util;
import monitormercado.util.UtilIO;

public class EstrategiaCandles extends Estrategia {

	private static final String nome = "Candles";

	public EstrategiaCandles() {
		super(nome);
	}

	@Override
	public Analise identificarSinais(List<Tick> ticks, Date dataInicial, Date dataFinal) {
		Analise analise = new Analise();
		String sigla = ticks.get(0).getSigla();
		
		int numeroTicks = ticks.size();
		for (int i = 0; i < numeroTicks - 2; i++) {
			Tick penultimo = ticks.get(i);
			Tick anterior = ticks.get(i + 1);
			Tick atual = ticks.get(i + 2);
			
			PadraoCandle padraoCandle = new PadraoCandle(atual.getData(), sigla);
			padraoCandle.identificar(atual, anterior, penultimo);
			if (padraoCandle.verificarExistencia(PadraoCandle.CANDLE_ESTRELA_MANHA)) {
					System.out.println("Compra " + atual.getData());
					Sinal sinal = new Sinal(nome, Conclusao.COMPRA, atual);
					analise.incluirSinal(sinal, dataInicial, dataFinal);
			} else if (padraoCandle.verificarExistencia(PadraoCandle.CANDLE_ESTRELA_TARDE)) {

					System.out.println("Venda " + atual.getData());
//					Sinal sinal = new Sinal(nome, Conclusao.VENDA, ticks.get(i + 22));
					Sinal sinal = new Sinal(nome, Conclusao.VENDA, atual);
					analise.incluirSinal(sinal, dataInicial, dataFinal);
//				}
			}
		}
		return analise;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		ControladorTick controladorTick = new ControladorTick();
		EstrategiaBuyHold estrategiaBuyHold = new EstrategiaBuyHold();
		EstrategiaCandles estrategiaCandles = new EstrategiaCandles();
		Simulador simulador = new Simulador();
		ResultadoCombinadoSimulacao resultadoSimulacao = new ResultadoCombinadoSimulacao();
		//List<String> acoes = UtilIO.carregarListaAtivos();
		List<String> acoes = Configuracao.getListaAtivos();

		for (String siglaAcao : acoes) {
			System.out.println(siglaAcao);
			List<Tick> ticks = controladorTick.recuperarTodosTicksPorData(siglaAcao);
			try {
				Double stop = null;
				Date dataInicial = ticks.get(0).getData();
				Date dataFinal = ticks.get(ticks.size() - 1).getData();
				simulador.simular(siglaAcao, ticks, estrategiaCandles, resultadoSimulacao, stop, dataInicial,
						dataFinal);
				simulador
						.simular(siglaAcao, ticks, estrategiaBuyHold, resultadoSimulacao, stop, dataInicial, dataFinal);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		for (String siglaAcao : acoes) {

			try {
				for (String estrategia : resultadoSimulacao.getEstrategias()) {

					ResultadoFinalSimulacaoAcao resultado = resultadoSimulacao.getResultadoAcao(estrategia, siglaAcao);

					System.out.println(estrategia);
					System.out.println(resultado.getSiglaAcao() + " | "
							+ Util.formatarPercentagem(resultado.getRetornoTotal() - 1));

					System.out.println(" Sinais: ");

					if (estrategia.equals("Candles")) {
						for (ResultadoParcialSimulacao parcial : resultado.getResultadosParciais()) {
							Sinal sinalCompra = parcial.getSinalCompra();
							Sinal sinalVenda = parcial.getSinalVenda();

							System.out.println(sinalCompra);
							System.out.println(sinalVenda);
						}
					} else {
						for (ResultadoParcialSimulacao parcial : resultado.getResultadosParciais()) {
							Sinal sinalCompra = parcial.getSinalCompra();
							Sinal sinalVenda = parcial.getSinalVenda();

							/* Vendeu pelo Stop Loss */
							System.out.println("Compra: " + sinalCompra.getTick().getData() + " |"
									+ sinalCompra.getPreco());
							System.out.println("Venda: " + sinalVenda.getTick().getData() + " |"
									+ sinalVenda.getPreco());
						}
					}

				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		FachadaBD.getInstancia().fecharBD();

	}
}
